package main

// func main() {
// 	var x int32
// 	var s = "hello, world!"
// 	println(x, s)
// 	// fmt.Println("hello, world!")
// }

// if
// func main() {
// 	x := 100
// 	if x > 0 {
// 		println(x)
// 	} else if x < 0 {
// 		println(-x)
// 	} else {
// 		println(0)
// 	}
// }

// switch
// func main() {
// 	x := 100
// 	switch {
// 	case x > 0:
// 		println("xs")
// 	case x < 0:
// 		println("-x")
// 	default:
// 		println("0")
// 	}
// }

// for

// func main() {
// 	for i := 0; i < 6; i++ {
// 		println(i)
// 	}
// 	for i := 4; i >= 0; i-- {
// 		println(i)
// 	}

// }

// func main() {
// 	x := 0
// 	for x < 5 {
// 		println(x)
// 		x++
// 	}
// }

// func main() {
// 	x := 5
// 	for {
// 		println(x)
// 		x--
// 		if x < 0 {
// 			break
// 		}
// 	}
// }

// 函数

// func div(a, b int) (int, error) {
// 	if b == 0 {
// 		return 0, errors.New("devising by zero")
// 	}
// 	return a / b, nil
// }

// func main() {
// 	a, b := 10, 2
// 	c, error := div(a, b)
// 	fmt.Println(c, error)
// }

// 函数是第一类型 可作为参数或者返回值
// func test(x int) func() {
// 	return func() {
// 		println(x)
// 	}
// }

// func main() {
// 	x := 100
// 	f := test(x)
// 	f()
// }

// defer 定义延迟调用 无论函数是否出错， 都确保结束前被调用
// func test(a, b int) {
// 	defer println("dispose")
// 	println(a / b)
// 	// defer println("close")
// }

// func main() {
// 	test(10, 0)
// }

// 数据

// 切片
// func main() {
// 	x := make([]int, 0, 5)
// 	for i := 0; i < 8; i++ {
// 		x = append(x, i)
// 	}
// 	fmt.Println(x)
// }

// 字典
// func main() {
// 	m := make(map[string]int) // 创建字典类型对象
// 	m["a"] = 1                // 添加或设置
// 	x, ok := m["b"]
// 	fmt.Println(x, ok)
// 	delete(m, "a") // 删除
// }

// import (
// 	"fmt"
// )

// // 结构体
// type user struct {
// 	name string
// 	age  int
// }

// type manager struct {
// 	user  // 匿名嵌入其他类型
// 	title string
// }

// func main() {
// 	var m manager
// 	m.name = "Tom"
// 	m.age = 29
// 	m.title = "CTO"
// 	fmt.Println(m)
// }

// 方法
// type X int

// func (x *X) inc() {
// 	*x++
// }

// func (x X) dec() {
// 	x--
// 	println(x)
// }

// func main() {
// 	var x X
// 	x.inc()
// 	println(x)
// 	x.dec()
// 	println(x)
// }

// 匿名字段
// import (
// 	"fmt"
// )

// // 结构体
// type user struct {
// 	name string
// 	age  int
// }

// type manager struct {
// 	user  // 匿名嵌入其他类型
// 	title string
// }

// func (u user) ToString() string {
// 	return fmt.Sprintf("%+v", u)
// }

// func (u user) Print() {
// 	fmt.Printf("%+v", u)
// }

// type Printer interface {
// 	Print()
// }

// func main() {
// 	var m manager
// 	m.name = "Tom"
// 	m.age = 29
// 	m.title = "CTO"
// 	// fmt.Println(m.ToString())

// 	var u user
// 	u.name = "lg"
// 	u.age = 29
// 	var p Printer = u
// 	p.Print()
// }

// 并发
// import (
// 	"fmt"
// 	"time"
// )

// func task(id int) {
// 	for i := 0; i < 5; i++ {
// 		fmt.Printf("%d: %d\n", id, i)
// 		time.Sleep(time.Second)
// 	}
// }

// func main() {
// 	go task(1)
// 	go task(2)

// 	time.Sleep(time.Second * 6)
// }

// 通道  channel 常与goroutine搭配 实现用通信代替内存共享的CSP模型
func comsumer(data chan int, done chan bool) {
	for x := range data { // 接受数据 直到通道被关闭
		println("recv:", x)
	}
	done <- true // 通知main  消费结束
}

func producer(data chan int) {
	for i := 0; i < 100; i++ { // 发送数据
		data <- i
	}
	close(data) // 关闭通道
}

func main() {
	done := make(chan bool) // 用于接受消费结束信号
	data := make(chan int)  // 数据管道
	go comsumer(data, done) // 启动消费者
	go producer(data)       // 启动生产者
	<-done
}
